/**
 * 寻找重复数
 * LeetCode 287
 */

public class test2 {

    /*
        核心思路：从0开始，0 位置是几，就走到几位置去
        如果一个位置上的值对应的下一步的索引以前出现过，则表示这个值为重复值
     */
    public int findDuplicate(int[] nums) {
        if(nums == null || nums.length < 2){
            return -1;
        }
        // 慢指针一次走一步
        // 快指针一次走两部
        int slow = nums[0];
        int fast = nums[nums[0]];
        while(fast != slow){
            slow = nums[slow];
            fast = nums[nums[fast]];
        }
        // 相遇
        fast = 0;
        while(slow != fast){
            slow = nums[slow];
            fast = nums[fast];
        }
        return slow;
    }

}
